package v1

import (
	"wms/internal/model"
	"wms/internal/service"
	"wms/pkg/common"
	"wms/pkg/logger"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// UnitController 单位控制器
type UnitController struct {
	unitService *service.UnitService
}

// NewUnitController 创建单位控制器
func NewUnitController() *UnitController {
	return &UnitController{
		unitService: service.NewUnitService(),
	}
}

// List godoc
// @Summary 获取单位列表
// @Description 获取所有计量单位列表
// @Tags 单位管理
// @Accept json
// @Produce json
// @Param keyword query string false "搜索关键词"
// @Success 200 {object} common.Response{data=[]model.Unit} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /api/v1/units [get]
func (c *UnitController) List(ctx *gin.Context) {
	var req struct {
		Keyword string `form:"keyword"`
		Status  int    `form:"status"`
	}
	if err := ctx.ShouldBindQuery(&req); err != nil {
		logger.Warn("绑定单位列表请求参数失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	units, err := c.unitService.ListUnits(req.Keyword, req.Status)
	if err != nil {
		logger.Error("获取单位列表失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, units)
}

// Create godoc
// @Summary 创建单位
// @Description 创建新的计量单位
// @Tags 单位管理
// @Accept json
// @Produce json
// @Param unit body model.Unit true "单位信息"
// @Success 200 {object} common.Response "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /api/v1/units [post]
func (c *UnitController) Create(ctx *gin.Context) {
	var unit model.Unit
	if err := ctx.ShouldBindJSON(&unit); err != nil {
		logger.Warn("绑定创建单位请求参数失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	if err := c.unitService.CreateUnit(&unit); err != nil {
		logger.Error("创建单位失败", zap.Error(err), zap.Any("unit", unit))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, nil)
}

// Update godoc
// @Summary 更新单位
// @Description 更新单位信息
// @Tags 单位管理
// @Accept json
// @Produce json
// @Param unit body model.Unit true "单位信息"
// @Success 200 {object} common.Response "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /api/v1/units [put]
func (c *UnitController) Update(ctx *gin.Context) {
	var unit model.Unit
	if err := ctx.ShouldBindJSON(&unit); err != nil {
		logger.Warn("绑定更新单位请求参数失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	if err := c.unitService.UpdateUnit(&unit); err != nil {
		logger.Error("更新单位失败", zap.Error(err), zap.Any("unit", unit))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, nil)
}

// Delete godoc
// @Summary 删除单位
// @Description 删除指定单位
// @Tags 单位管理
// @Accept json
// @Produce json
// @Param id body uint true "单位ID"
// @Success 200 {object} common.Response "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /api/v1/units [delete]
func (c *UnitController) Delete(ctx *gin.Context) {
	var req struct {
		ID uint `json:"id" binding:"required"`
	}

	if err := ctx.ShouldBindJSON(&req); err != nil {
		logger.Warn("绑定删除单位请求参数失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	if err := c.unitService.DeleteUnit(req.ID); err != nil {
		logger.Error("删除单位失败", zap.Error(err), zap.Uint("id", req.ID))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, nil)
}

// Get godoc
// @Summary 获取单位详情
// @Description 根据单位ID获取单位详细信息
// @Tags 单位管理
// @Accept json
// @Produce json
// @Param id path int true "单位ID"
// @Success 200 {object} common.Response{data=model.Unit} "成功"
// @Failure 400 {object} common.Response "请求错误"
// @Failure 500 {object} common.Response "内部错误"
// @Router /api/v1/units/{id} [get]
func (c *UnitController) Get(ctx *gin.Context) {
	id := common.GetIDParam(ctx)
	if id == 0 {
		common.Error(ctx, common.ErrInvalidParams)
		return
	}

	unit, err := c.unitService.GetUnit(id)
	if err != nil {
		logger.Error("获取单位详情失败", zap.Error(err), zap.Uint("id", id))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, unit)
} 